﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
using CRC.Clases;
using CRC.Inspecciones.Dominio.Clases;
using CRC.Inspecciones.Dominio.Controlador;
using CRC.GestionSalones.Dominio.Clases;

namespace CRC.Inspecciones.Presentacion
{
    public partial class UsrGestionZonasInspeccion : UserControl, IListadoInspectores , IListadoZonasListener
    {
        //Controlador para gestion de zonas de inspeccion
        private Controlador_GestionZonasEInspecciones cGestZonas = new Controlador_GestionZonasEInspecciones();
        
        //Constructor
        public UsrGestionZonasInspeccion()
        {
            InitializeComponent();
            ObtenerZonas();
            ObtenerInspectores();
            LstZonas.DoubleClick += new EventHandler(LstZonas_DoubleClick);
            LstZonas.SelectedIndexChanged += new EventHandler(LstZonas_SelectedIndexChanged);
            panel1.ControlAdded += new ControlEventHandler(panel1_ControlAdded);
            panel1.ControlRemoved += new ControlEventHandler(panel1_ControlRemoved);
            LstInspectores.DoubleClick += new EventHandler(LstInspectores_DoubleClick);
            LstInspectores.SelectedIndexChanged += new EventHandler(LstInspectores_SelectedIndexChanged);
        }

        

        #region "Operaciones"

        public void ObtenerZonas()
        {

            try {

                LstZonas.DataSource = cGestZonas.ObtenerZonas();;
                LstZonas.ValueMember = "Id";
                LstZonas.DisplayMember = "Nombre";
            }
            catch (Exception ex) {

                MessageBox.Show( 
                    "Error al cargar las zonas." + ex.Message, 
                    "Error", 
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Error
                );
            }
        }

        public void ObtenerInspectores()
        {

            try
            {

                LstInspectores.DataSource=cGestZonas.ObtenerInspectores();
                LstInspectores.ValueMember = "Id";
                LstInspectores.DisplayMember = "NombreCompleto";
            }
            catch (Exception ex)
            {

                MessageBox.Show(
                    "Error al cargar los inspectores." + ex.Message,
                    "Error",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error
                );
            }
        }

        #endregion

        #region "Event handlers"

        void LstInspectores_SelectedIndexChanged(object sender, EventArgs e)
        {
            butEliminarInspector.Enabled = (LstInspectores.SelectedIndex != -1);
            butVerEditarInspector.Enabled = (LstInspectores.SelectedIndex != -1);
        }

        void LstInspectores_DoubleClick(object sender, EventArgs e)
        {
            EditarInspector editarInspector = new EditarInspector((int)LstInspectores.SelectedValue);
            editarInspector.añadirListadoInspectoresListener(this);
            if (panel1.Controls.Count == 1)
            {
                editarInspector.añadirListadoInspectoresListener((UsrZona)panel1.Controls[0]);
            }
            editarInspector.StartPosition = FormStartPosition.CenterScreen;
            editarInspector.ShowDialog(this);
        }

        void panel1_ControlRemoved(object sender, ControlEventArgs e)
        {
            groupBox1.Enabled = true;
        }

        void panel1_ControlAdded(object sender, ControlEventArgs e)
        {
            groupBox1.Enabled = false;
        }

        void LstZonas_SelectedIndexChanged(object sender, EventArgs e)
        {
            butQuitarZona.Enabled = (LstZonas.SelectedIndex != -1);
            butVerEditarZona.Enabled = (LstZonas.SelectedIndex != -1);
        }

        private void butNuevaZona_Click(object sender, EventArgs e)
        {
            NuevaZona nuevaZonaG = new NuevaZona();
            nuevaZonaG.Dock = DockStyle.Fill;
            nuevaZonaG.añadirIListadoZonasListener(this);
            this.panel1.Controls.Add(nuevaZonaG);
        }

        private void butAltaInspector_Click(object sender, EventArgs e)
        {
            AltaInspector nuevoInspector = new AltaInspector();
            nuevoInspector.añadirListadoInspectoresListener(this);
            if (panel1.Controls.Count == 1)
            {
                nuevoInspector.añadirListadoInspectoresListener((UsrZona)panel1.Controls[0]);
            }
            nuevoInspector.StartPosition = FormStartPosition.CenterParent;
            nuevoInspector.ShowDialog(this);
        }

        private void butQuitarZona_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Seguro que quieres eliminar esta zona?", 
                "Confirmación",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question
            ) == DialogResult.Yes)
            {
                try 
                { 
                    Controlador_EliminarZona cEZ = new Controlador_EliminarZona();
                    cEZ.EliminarZona((int)LstZonas.SelectedValue);
                    ((IList<Zona>)LstZonas.DataSource).Remove((Zona)LstZonas.SelectedItem);
                    ((CurrencyManager)this.BindingContext[LstZonas.DataSource]).Refresh();
                    }
                catch(Exception ex)
                {
                    MessageBox.Show(
                        ex.Message,
                        "Advertencia",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Warning
                    );
                }
                
            }
            
        }

        void LstZonas_DoubleClick(object sender, EventArgs e)
        {
            if (LstZonas.SelectedValue != null) 
            {
                EditarZona editarZona = new EditarZona((int)LstZonas.SelectedValue);
                editarZona.añadirIListadoZonasListener(this);
                editarZona.Dock = DockStyle.Fill;
                this.panel1.Controls.Add(editarZona);
            }
        }

         private void butVerEditaZona_Click(object sender, EventArgs e)
        {
            if (LstZonas.SelectedValue != null)
            {
                EditarZona editarZona = new EditarZona((int)LstZonas.SelectedValue);
                editarZona.añadirIListadoZonasListener(this);
                editarZona.Dock = DockStyle.Fill;
                this.panel1.Controls.Add(editarZona);
            }
        }

        #endregion

        #region Miembros de IListadoInspectores

        public void añadirInspector(Persona inspector)
        {
            IList<Persona> inspectores = ((IList<Persona>)LstInspectores.DataSource);
            //añadimos inspector a la origen de datos
            inspectores.Add(inspector);
            //Refrescamos el mapeo del origen de datos de datos
            ((CurrencyManager)this.BindingContext[inspectores]).Refresh();
        }

        public void actualizarInspector(Persona inspector)
        {
            ((CurrencyManager)this.BindingContext[LstInspectores.DataSource]).Refresh();
        }

        #endregion

        #region Miembros de IListadoZonas

        public void añadirZona(Zona zona)
        {
            IList<Zona> zonas = (IList<Zona>)LstZonas.DataSource;
            zonas.Add(zona);
            ((CurrencyManager)this.BindingContext[zonas]).Refresh();
        }

        public void actualizarZona(Zona zona)
        {
            ((CurrencyManager)this.BindingContext[LstZonas.DataSource]).Refresh();
        }
        #endregion

        private void butVerEditarInspector_Click(object sender, EventArgs e)
        {
            EditarInspector editarInspector = new EditarInspector((int)LstInspectores.SelectedValue);
            editarInspector.añadirListadoInspectoresListener(this);
            if (panel1.Controls.Count == 1)
            {
                editarInspector.añadirListadoInspectoresListener((UsrZona)panel1.Controls[0]);
            }
            editarInspector.StartPosition = FormStartPosition.CenterScreen;
            editarInspector.ShowDialog(this);
        }

        private void butEliminarInspector_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Seguro que quieres eliminar este inspector?",
                "Confirmación",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question
            ) == DialogResult.Yes)
            {
                try 
                { 
                     Controlador_EliminarInspector cEI = new Controlador_EliminarInspector();
                    cEI.eliminarInspector((int)LstInspectores.SelectedValue);
                    ((IList<Persona>)LstInspectores.DataSource).Remove((Persona)LstInspectores.SelectedItem);
                    ((CurrencyManager)this.BindingContext[LstInspectores.DataSource]).Refresh();
                }
                catch (ApplicationException aEx)
                {
                    MessageBox.Show(
                        aEx.Message,
                        "Advertencia",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Warning
                    );
                }
                catch (Exception ex) 
                {
                    MessageBox.Show(
                        ex.Message, 
                        "Error", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Error
                    );
                }
               
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void butDarDeBaja_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Seguro que quieres dar de baja el representante?",
                "Confirmación",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question
            ) == DialogResult.Yes)
            {
                try
                {
                    Controlador_EliminarInspector cEI = new Controlador_EliminarInspector();
                    cEI.darDeBajaInspector((int)LstInspectores.SelectedValue);
                    ((IList<Persona>)LstInspectores.DataSource).Remove((Persona)LstInspectores.SelectedItem);
                    ((CurrencyManager)this.BindingContext[LstInspectores.DataSource]).Refresh();
                }
                catch (ApplicationException aEx)
                {
                    MessageBox.Show(
                        aEx.Message,
                        "Advertencia",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Warning
                    );
                }
                catch (Exception ex)
                {
                    MessageBox.Show(
                        ex.Message,
                        "Error",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error
                    );
                }

            }
        }
       
    }

}
